#ifndef __HART_FRAME_USER_H__
#define __HART_FRAME_USER_H__
#include "lib.h"
#if defined(__CC_ARM)
#pragma anon_unions
#endif

// 定位器参数定义
typedef enum
{
    // 通用参数
    COMMAND_CUSTOM_CODE_GENERIC = 1,
    // 行程参数
    COMMAND_CUSTOM_CODE_TRAVEL,
    // 部分行程参数
    COMMAND_CUSTOM_CODE_PARTIAL_TRAVEL,
    // 死区参数
    COMMAND_CUSTOM_CODE_DEADZONE,
    // 预留参数
    COMMAND_CUSTOM_CODE_RESERVE,
    // 累计参数
    COMMAND_CUSTOM_CODE_ACCUMULATION,
    // SWO参数
    COMMAND_CUSTOM_CODE_SWO,
    // 电流参数
    COMMAND_CUSTOM_CODE_CURRENT,
    // 压力参数
    COMMAND_CUSTOM_CODE_PRESSURE,
    // 阀门参数
    COMMAND_CUSTOM_CODE_VALVE,
    // 小信号参数
    COMMAND_CUSTOM_CODE_SMALL_SIGNAL,
    // PID参数
    COMMAND_CUSTOM_CODE_PID,
    // 报警参数
    COMMAND_CUSTOM_CODE_ALARM,
    // 附件参数
    COMMAND_CUSTOM_CODE_ATTACHMENT,
    // 功能参数
    COMMAND_CUSTOM_CODE_FUNCTION,
    // 只读参数
    COMMAND_CUSTOM_CODE_READONLY,
    COMMAND_CUSTOM_CODE_MAX,
} command_custom_code_e;

typedef enum
{

    HART_COMMAND_130_EVENT,    // 自定义参数读取
    HART_COMMAND_131_EVENT,    // 自定义参数写入
    HART_COMMAND_132_EVENT,    // 自定义参数读取(拓展)
    HART_COMMAND_133_EVENT,    // 自定义参数写入(拓展)
    HART_COMMAND_140_EVENT,    // 重置参数
    HART_COMMAND_257_EVENT,    // 寻找、计算P / I / D
    HART_COMMAND_258_EVENT,    // 计算 摩擦力
    HART_COMMAND_259_EVENT,    // 计算 弹簧力
    HART_COMMAND_UPDATE_EVENT, // 刷新用户数据
    HART_COMMAND_500_EVENT,    // 测试指令
} hart_interface_user_event_e;

typedef enum
{
    TEST_TYPE_RTC_WRITE,         // RTC写入测试
    TEST_TYPE_RTC_READ,          // RTC读取测试
    TEST_TYPE_ADC0,              // 回路电流(转换成数字量)
    TEST_TYPE_ADC1,              // 阀位反馈(读取模拟量)
    TEST_TYPE_ADC2,              // 气压源压力(读取模拟量)
    TEST_TYPE_ADC3,              // 位置反馈-小回路(读取模拟量)
    TEST_TYPE_ADC4,              // 温度检测(转换成数字量)
    TEST_TYPE_DAC,               // DAC输出(写入模拟量)
    TEST_TYPE_ADC6,              // IP电流检测(读取模拟量)
    TEST_TYPE_ADC13,             // 输出电压检测(读取模拟量)
    TEST_TYPE_ADC14,             // 压力传感器-A口(读取模拟量)
    TEST_TYPE_ADC15,             // 压力传感器-B口(读取模拟量)
    TEST_TYPE_IP,                // IP输出检测(IO检测)
    TEST_TYPE_HIP,               // IP大电流输出检测(IO检测)
    TEST_TYPE_PWM,               // 输出阀位反馈对应的电流
    TEST_TYPE_LCD,               // LCD测试,LCD DETECT检测电平来使能LCD (需要人工判断，全屏显示黑色)
    TEST_TYPE_EEPROM_M95_WRITE,  // m95写入测试
    TEST_TYPE_EEPROM_M95_READ,   // m95读取测试
    TEST_TYPE_EEPROM_FM24_WRITE, // fm24写入测试
    TEST_TYPE_EEPROM_FM24_READ,  // fm24读取测试
    TEST_TYPE_BTN1,              // 按键1(需要人工触发)
    TEST_TYPE_BTN2,              // 按键2(需要人工触发)
    TEST_TYPE_BTN3,              // 按键3(需要人工触发)
    TEST_TYPE_BTN4,              // 按键4(需要人工触发)
    TEST_TYPE_BLE,               // 蓝牙测试(接入、发送、接收)
} test_type_e;

typedef enum
{
    BURST_FITNESS = 1, // 适应度(清华测试数据)
} burst_test_data_e;

#pragma pack(1)

typedef struct
{
    uint8_t control_mode;                                      // 控制模式 在线/离线
    uint8_t position_selector;                                 // 位置作用选择
    uint8_t pressure_selector;                                 // 压力作用选择
    uint8_t gas_opening_closing;                               // 气开/气关
    uint8_t valve_model[32];                                   // 阀门型号
    uint16_t pressure_A;                                       // A口压力
    uint16_t pressure_B;                                       // B口压力
    uint16_t position_feedback_amplifier_circuit_control_gain; // 位置反馈-放大器回路控制增益
    uint16_t pressure_feedback_amplifier_circuit_control_gain; // 压力反馈-放大器回路控制增益
    float32 threshold_control;                                 // 阀位控制
    float32 amplifier_circuit_control;                         // 放大器回路控制
    float32 position_feedback_P;                               // 位置反馈--P
    float32 position_feedback_I;                               // 位置反馈--I
    float32 position_feedback_D;                               // 位置反馈--D
    float32 pressure_feedback_P;                               // 压力反馈--P
    float32 pressure_feedback_I;                               // 压力反馈--I
    float32 pressure_feedback_D;                               // 压力反馈--D
    float32 spring_coefficient;                                // 弹簧系数
    float32 gas_inlet_cross_sectional_area;                    // 气室活塞面积
} hart_storage_variable_user_t;

typedef struct
{
    float32 *input_current;                // 输入电流
    uint16_t *valve_feedback;              // 阀位反馈
    uint16_t *atmospheric_pressure_source; // 气压源压力
    uint16_t *pressure_at_port_a;          // A口压力
    uint16_t *pressure_at_port_b;          // B口压力
    uint16_t *amplifier_circuit;           // 放大器回路
    float32 *built_in_temperature;         // 内置温度
    uint16_t *ip_output_detection;         // IP输出检测
    float32 *valve_percentage;             // 阀位百分比
} analog_quantity_t;                       // 模拟量

typedef struct
{
    float32 *input_current;                // 输入电流
    uint16_t *valve_feedback;              // 阀位反馈
    uint16_t *atmospheric_pressure_source; // 气压源压力
    uint16_t *pressure_at_port_a;          // A口压力
    uint16_t *pressure_at_port_b;          // B口压力
    uint16_t *amplifier_circuit;           // 放大器回路
    float32 *built_in_temperature;         // 内置温度
    uint16_t *ip_output_detection;         // IP输出检测

    float32 *target_row;   // 目标行程
    float32 *current_row;  // 当前行程
    float32 *friction;     // 摩擦力
    float32 *spring_force; // 弹簧力

} digital_quantity_t; // 数字量

// 自定义参数读取
typedef struct
{
    uint8_t display_direction;          // 显示方向
    uint8_t language;                   // 显示语言
    uint8_t poll_address;               // 控制器地址(轮询地址)
    uint8_t workmode;                   // 工作模式
    uint8_t actuator;                   // 执行机构单/双作用
    uint8_t controller_action;          // 定位器(控制器)正/反作用
    uint8_t travel_type;                // 行程类型, 直行程/角行程
    uint8_t air_action;                 // 气开/气关设置
    uint8_t speed_increaser_enable;     // 增速器
    uint8_t quick_exhaust_valve_enable; // 快排阀
    uint8_t control_mode;               // 开机恢复到上一次位置使能
    uint8_t process_change_flag;        // 磁条接收的反馈电压
    uint8_t wireless_comm_enable;       // 无线通讯使能
    uint8_t m_aoutput_enable;           // PWM 4-20mA使能
} hart_custom_generic_t;                // 通用参数

typedef struct
{
    uint16_t travel_range_self;     // 行程自定义范围
    uint8_t travel_disp_mode;       // 行程显示模式
    uint8_t travel_unit;            // 行程单位
    float32 travel_error;           // 行程误差
    uint8_t travel_error_wait_time; // 行程误差等待时间
    float32 travel_upper_alarm;     // 行程上限报警
    float32 travel_lower_alarm;     // 行程下限报警
} hart_custom_travel_t;             // 行程参数
typedef struct
{
    uint8_t part_travel_enable; // 部分行程使能
    float32 part_travel_min;    // 部分行程最小
    float32 part_travel_max;    // 部分行程最大
} hart_custom_partial_travel_t; // 部分行程参数
typedef struct
{
    float32 travel_dead;                  // 行程死区
    float32 travel_dead_upper;            // 行程死区上限
    uint16_t travel_dead_upper_wait_time; // 行程死区上限等待时间
} hart_custom_deadzone_t;                 // 死区参数
typedef struct
{
    uint32_t travel_sum;       // 行程累计
    uint32_t travel_sum_upper; // 行程累计上限
    uint32_t act_sum;       // 动作次数
    uint32_t act_number_upper; // 动作次数上限
} hart_custom_accumulation_t;  // 累计参数
typedef struct
{
    uint8_t sw1_trigger_logic; // 阀门开关SWO1触发条件
    float32 sw1_trigger_value; // 阀门开关SWO1触发值
    uint8_t sw2_trigger_logic; // 阀门开关SWO2触发条件
    float32 sw2_trigger_value; // 阀门开关SWO2触发值
} hart_custom_swo_t;           // SWO参数
typedef struct
{
    float32 inputil;          // 输入电流最低
    float32 inputih;          // 输入电流最高
    float32 input_ilow_alarm; // 电流报警下限
} hart_custom_current_t;      // 电流参数
typedef struct
{
    uint8_t press_unit;                       // 压力单位
    float32 supply_pressure;                  // 输入的额定气源压力
    float32 supply_pressure_error;            // 气源偏差范围±%
    uint16_t supply_pressure_error_wait_time; // 供气压力误差等待时间
    float32 pressure_offset;                  // 压力偏移量
} hart_custom_pressure_t;                     // 压力参数
typedef struct
{
    float32 travel_rate_open;      // 阀门打开(上行)变化速率
    float32 travel_rate_close;     // 阀门关闭(下行)变化速率
    uint8_t valve_characteristics; // 阀门特性
    uint8_t self_vchart[17];       // 自定义阀门特性
} hart_custom_valve_t;             // 阀门参数
typedef struct
{
    uint8_t valve_serial_num[16];     // 阀门序列号
    uint8_t inst_serial_num[16];      // 仪器序列号
    uint8_t valve_style;              // 阀门类型
    uint16_t spec_valve_size;         // 阀门尺寸
    uint8_t spec_valve_class;         // 阀门等级
    float32 spec_valve_stem_diameter; // 阀门阀杆直径
    uint8_t spec_valve_packing_type;  // 阀门包装类型
} hart_custom_valve_expand_t;         // 阀门参数(拓展)
typedef struct
{
    uint8_t small_signal_cut_enable; // 小信号截断使能
    float32 small_signal_upper;      // 小信号上限
    float32 small_signal_lower;      // 小信号下限
} hart_custom_small_signal_t;        // 小信号参数
typedef struct
{
    uint8_t pid_index; // PID参数选择
    float32 apid_kp;
    float32 apid_ti;
    float32 apid_td;
    float32 spid_kp;
    float32 spid_ti;
    float32 spid_td;
    uint8_t integral_enable; // 积分使能
    float32 ini_integral;    // 积分初始值
    float32 integral_zone;   // 积分工作区域(%)
} hart_custom_pid_t;         // PID参数
typedef struct
{
    uint16_t dac_alarm_wait_time;    // 放大器报警设置
    uint8_t alarm_handle_mode;       // 报警处理方式
    float32 temperature_upper_alarm; // 温度报警上限
    float32 temperature_lower_alarm; // 温度报警下限
} hart_custom_alarm_t;               // 报警参数
typedef struct
{
    float32 friction_upper;                       // 允许的摩擦力上限
    float32 friction_lower;                       // 允许的摩擦力下限
    float32 elasticity_upper;                     // 允许的弹性上限
    float32 elasticity_lower;                     // 允许的弹性下限
    uint8_t magnetic_stripe_specification_number; // 磁条规格序号
} hart_custom_attachment_t;                       // 附件参数
typedef struct
{
    uint16_t save_record_interval; // 记录存储间隔时间(秒)
    uint16_t travel_gap;           // 间隙控制范围(%)
} hart_custom_function_t;          // 功能参数
typedef struct
{
    float32 spec_valve_rated_travel;  // 目标行程
    float32 spec_valve_actual_travel; // 实际行程
    float32 max_recorded_temp;        // 最大记录温度
    float32 min_recorded_temp;        // 最小记录温度
    uint32_t number_of_power_ups;     // 加电次数
} hart_custom_function_expand_t;      // 功能参数(拓展)
typedef struct
{
    uint16_t travel_vol0;           // 行程起点反馈电压
    uint16_t travel_vol100;         // 行程终点反馈电压
    float32 travel_pressure_a0;     // 整定时，阀门A 0%气压值
    float32 travel_pressure_a100;   // 整定时，阀门A 100%气压值
    float32 travel_pressure_b0;     // 整定时，阀门B 0%气压值
    float32 travel_pressure_b100;   // 整定时，阀门B 100%气压值
    uint16_t dac_max;               // 整定时，阀门动作的所需要的上限值
    uint16_t dac_min;               // 整定时，阀门动作的所需要的下限值
    uint16_t pos_mid_dac_val;       // DAC中间值 用于刹车
    uint16_t all_open_time;         // 阀门全开时间
    uint16_t all_close_time;        // 阀门全关时间
    float32 friction;               // 摩擦力
    float32 elasticity;             // 弹簧力
    uint8_t tunedFlag;              // 整定状态
    uint16_t current_calibration_a; // PWM电流标定4ma值
    uint16_t current_calibration_b; // PWM电流标定20ma值
    uint16_t minor_loop_vol0_val;   // 小回路最小值
    uint8_t minor_loop_vol100_val;  // 小回路最大值
} hart_custom_readonly_t;           // 只读参数
typedef struct
{
    uint8_t code;
    uint8_t data_length;
    union
    {
        uint8_t buf[254];
        hart_custom_generic_t generic;                 // 通用参数
        hart_custom_travel_t travel;                   // 行程参数
        hart_custom_partial_travel_t partial_travel;   // 部分行程参数
        hart_custom_deadzone_t deadzone;               // 死区参数
        hart_custom_accumulation_t accumulation;       // 累计参数
        hart_custom_swo_t swo;                         // SWO参数
        hart_custom_current_t current;                 // 电流参数
        hart_custom_pressure_t pressure;               // 压力参数
        hart_custom_valve_t valve;                     // 阀门参数
        hart_custom_valve_expand_t valve_expand;       // 阀门参数(拓展)
        hart_custom_small_signal_t small_signal;       // 小信号参数
        hart_custom_pid_t pid;                         // PID参数
        hart_custom_alarm_t alarm;                     // 报警参数
        hart_custom_attachment_t attachment;           // 附件参数
        hart_custom_function_t function;               // 功能参数
        hart_custom_function_expand_t function_expand; // 功能参数(拓展)
        hart_custom_readonly_t readonly;               // 只读参数
    } data;
} hart_custom_variable_t;

// 开始：用户自定义指令数据结构定义
typedef struct
{
    uint8_t code;
} hart_command_130_t;

typedef struct
{
    uint8_t code;
    uint8_t data_length;
    uint8_t data[254];
} hart_command_131_t;

typedef struct
{
    uint8_t code;
} hart_command_132_t;

typedef struct
{
    uint8_t code;
    uint8_t data_length;
    uint8_t data[254];
} hart_command_133_t;

typedef struct
{
    uint8_t write_protect_code; // 写保护模式
} hart_command_141_t;

typedef struct
{
    uint8_t model; // 数据样品型号 / 气开（气关）
} hart_command_254_t;

typedef struct
{
    hart_storage_variable_user_t;
} hart_command_260_t;

// 自定义测试指令数据结构

// 结束：用户自定义指令数据结构定义

typedef struct
{
    uint8_t test_code;   // 测试类型
    uint8_t data_length; // 载荷长度
    uint8_t data[32];
} hart_command_500_t;

typedef struct
{
    uint8_t test_code;   // 测试类型
    uint8_t data_length; // 载荷长度
    uint8_t data[64];
} hart_command_501_t;
// 结束：用户自定义指令数据结构定义

typedef union
{
    hart_command_130_t command_130; // 自定义参数读取
    hart_command_131_t command_131; // 自定义参数设置
    hart_command_132_t command_132; // 自定义参数读取(拓展)
    hart_command_133_t command_133; // 自定义参数设置(拓展)
    hart_command_141_t command_141; // 写保护模式
    hart_command_254_t command_254; // 数据样品型号(气开\气关)
    hart_command_260_t command_260; // 编写参数配置
    hart_command_500_t command_500; // 测试指令
    hart_command_501_t command_501; // 突发测试数据
} hart_user_command_req_data_u;     // 用户自定义请求指令数据域

typedef struct
{
    hart_user_command_req_data_u data;  // 用户自定义请求指令数据域
    response_communication_code_e code; // 响应通信代码
    uint64_t uuid;                      // 唯一标识
} hart_user_req_t;

typedef struct
{
    // 这里存放的都是动态变量
    analog_quantity_t analog_quantity;   // 模拟量
    digital_quantity_t digital_quantity; // 数字量

} device_variable_dynamics_user_t; // 用户自定义动态变量

typedef struct
{
    // 通用接口
    BOOL(*user_common_event)
    (hart_interface_user_event_e event, const void *const data);
} hart_interface_user_t; // 用户自定义接口

#pragma pack()
                         // 用户自定义Flash变量

#endif // __HART_FRAME_USER_H__
